REM >PCDriver
REM***************************************************************************
REM     PC Keyboard Driver Software
REM     Written by Alex Bienek                      30th August 1990
REM     (c)1988 Acorn Computers Ltd.
REM     Filename: PCDriver
REM     Version : 1.0A Development version
REM****************************************************************************
ver$="1.0A"
:
PRINT"PC Keyboard Driver Software"
PRINT"Version ";ver$;"         August 30th 1990    A.B.":PRINT
PROCinit
!io_addr=Control:CALL byterd:I%=?io_data:PRINT~I% AND Clkdat
!io_data=I% EOR Clkdat:CALL bytewr
END


DEFPROCinit
 REM ** Arrays **
   DIM code &1000

 REM ** Arthur numbers **
   EnterOS=&16:SVC_mode=3:I_bit=1<<27

 REM ** Hardware addresses **
  T2Low=&03200060:T2High=&03200064
  Control=&03200000:PCdata=&08:PCclk=&10:Clkdat=&18
  I%=0
  PROCassm
ENDPROC


DEFPROCassm
 FOR pass=0 TO 2 STEP 2:P%=code
 [ OPT pass
;
; *** Main FDC data transfer routines ***
;
; *** General purpose read/write commands **
;
.bytewr     SWI   EnterOS            ;enter supervisor mode
            TEQP  pc,#I_bit+SVC_mode ;kill interrupts
            LDR   r1, io_addr        ;get i/o address into r1
            LDR   r0, io_data        ;get data to write into r0
            STRB  r0,[r1]            ;write data
            BAL   exit               ;and quit
 ;
.byterd     SWI   EnterOS            ;enter supervisor mode
            TEQP  pc,#I_bit+SVC_mode ;kill interrupts
            LDR   r1, io_addr        ;get i/o address into r1
            LDRB  r0,[r1]            ;read data
            STR   r0,io_data         ;store in variable io_data
            BAL   exit
;
; *** Global exit routine ***
;
.exit       TEQP  pc,#0              ;restore interrupts
            MOV   r0, r0             ;dont know what this does!
            MOVS  pc, r14            ;return
;
;
; *** Pointers and constants ***
;
.io_addr    EQUD &00000000
.io_data    EQUD &00000000
;
 ]:NEXT pass
ENDPROC
REM *** end of file ***
